package com.bowen.demo.demo006;

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * <h3>java-study</h3>
 * <p>Service</p>
 * @author : zhang.bw
 * @date : 2021-03-26 18:04
 **/
public class Service {

	/**
	 *  测试刚才实现的分布式锁
	 *
	 * 例子中使用50个线程模拟秒杀一个商品，使用–-运算符来实现商品减少，从结果有序性就可以看出是否为加锁状态。
	 *
	 * 模拟秒杀服务，在其中配置了jedis线程池，在初始化的时候传给分布式锁，供其使用。
	 */

	private static JedisPool pool = null;
	private DistributedLock lock = new DistributedLock(pool);
	int n = 500;

	static {
		JedisPoolConfig config = new JedisPoolConfig();
		// 设置最大连接数
		config.setMaxTotal(200);
		// 设置最大空闲数
		config.setMaxIdle(8);
		// 设置最大等待时间
		config.setMaxWaitMillis(1000 * 100);
		// 在borrow一个jedis实例时，是否需要验证，若为true，则所有jedis实例均是可用的
		config.setTestOnBorrow(true);
		pool = new JedisPool(config, "127.0.0.1", 6379, 3000);
	}

	/**
	 * 模拟秒杀
	 */
	public void seckill() {
		// 返回锁的value值，供释放锁时候进行判断
		String identifier = lock.lockWithTimeout("resource", 5000, 1000);
		System.out.println(Thread.currentThread().getName() + "获得了锁");
		System.out.println(--n);
		// 释放锁
		lock.releaseLock("resource", identifier);
	}

}